home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / ae / code / ax3.00 / callmsgfuncs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1980-01-03  |  49.6 KB  |  1,881 lines

  1. #include "bbs.h"
  2. extern struct myst my_struct;
  3. struct MyEditor
  4. {
  5.   SHORT MaxFileLength;
  6.   UBYTE MaxScrLength;
  7.   UBYTE EditorTop;
  8.   UBYTE EditorMaxWidth;
  9.   UBYTE EditorAnsiColor;
  10.   UBYTE EditorAllowLoad;
  11.   UBYTE EditorAllowAbort;
  12.   CPTR  EditorFile;
  13.   CPTR  EditorIncludeFile;
  14.   CPTR  EditorPrependFile;
  15.   CPTR  EditorPostPendFile;
  16. }; 
  17.  extern struct MyEditor EditorStruct;
  18.  
  19. //#define CO_SYSOPLEVEL 240     /* My CO_SYSOP LEVEL */
  20. extern int rzmsg;
  21. extern long NumOfZMsgs, Last_Msg_Read_Conf,Last_New_Read_Conf;
  22. int FWDFlag,NoDirF,TEMPFlag,ReplyFlag,Comment,PrivateFlag,NonStop,stat,Lines=0;
  23. long FWDToMsg,MSGNUM,DelMSGNUM,CurrentSeekPos,AlreadyRecvd;
  24. char FWDDir,AttachedFile[255];
  25. char MsgBuf[100][80];
  26. int netflag;
  27. int ValidNet(char *str);
  28. BPTR gfh;
  29. extern char NetConf[];
  30. struct User tuser;
  31. struct UserKeys tuserkeys;
  32. int SaveMsg(char *s);
  33. void DeleteMsgFiles(long num);
  34. void AttachMsgFiles(long num,char *s);
  35. /* static functions */
  36. int Edit(void);
  37. int doormsgcode=0;
  38. static int fileattach=0;
  39. extern int XIMPort;
  40. static int Readit(void);
  41. static void CreateFile(char *s)
  42. {
  43.  FILE *f;
  44.  
  45.  if(f=fopen(GSTR3,"w"))  {
  46.      fprintf(f,"DO NOT DELETE!\n");
  47.      fclose(f);
  48.  }
  49. }
  50.  
  51. static BPTR LockMsgBase(void)
  52. {
  53.  BPTR lock;
  54.  UWORD loop=0;
  55.  LONG error;
  56.  
  57.  sprintf(GSTR3,"%sMailLock",MsgBase_Location);
  58.  do  {
  59.      if(!(lock=Lock(GSTR3,ACCESS_WRITE))) {
  60.          error=IoErr();
  61.          if(error==205)        CreateFile(GSTR3);
  62.          Delay(120L);
  63.          SendChar('.');
  64.      }
  65.  } while(!lock&&loop++<30);
  66.  
  67.  if(!lock) {
  68.      sprintf(GSTR3,"\tError %ld trying to Lock MSGBASE\n",IoErr());
  69.      CallersLog(GSTR3);
  70.  }
  71.  return(lock);
  72. }
  73.  
  74. static void MsgToHeader(void)
  75. {
  76.  AEPutStr("\r\n                       (------------------------------)\r\n");
  77.  AEPutStr("     To(Enter)='ALL'? ");
  78. }
  79.  
  80. static int SaveStatOnly(void)
  81. {
  82. long error;
  83. char string[255];
  84. BPTR fd;
  85.  
  86.  strcpy(string,MsgBase_Location);
  87.  strcat(string,"MailStats");
  88.  if(!(fd=Open(string,MODE_NEWFILE))) {
  89.      MyError(2);
  90.      return(FAILURE);
  91.  }
  92.  
  93.  error=Write(fd,(char *)&MailStat,sizeof(struct MailStat));
  94.  if(error!=sizeof(struct MailStat))  {
  95.      AEPutStr("Wasn't the same!\r\n");
  96.      Close(fd);
  97.      MyError(2); 
  98.      return(FAILURE);
  99.  }
  100.  Close(fd);
  101.  return(SUCCESS);
  102. }
  103.  
  104.  
  105. static int Save_MessageHeader(void)
  106. {
  107.  extern int stat;
  108.  long error;
  109.  Seek(gfh,0,OFFSET_END);
  110.  error=Write(gfh,(char *)&MailHeader,sizeof(struct MailHeader));
  111.  if(error!=sizeof(struct MailHeader))    return(FAILURE);
  112.  
  113.  Seek(gfh,CurrentSeekPos,OFFSET_BEGINNING);
  114.  
  115.  MailStat.HighMsgNum+=1;
  116.  if(MailStat.HighMsgNum==2)  MailStat.LowestNotDel=1;
  117.  
  118.  stat=SaveStatOnly();
  119.  if(stat==FAILURE)   return(stat);
  120.  return(SUCCESS);
  121. }
  122.  
  123. static int CheckToForward(char *str,char *name,int check)
  124. {
  125.  int stat,error=0;
  126.  strcpy(GSTR3,Conference_Location);
  127.   if(GSTR3[strlen(GSTR3)-1]=='/') GSTR3[strlen(GSTR3)-1]='\0';
  128.  if(GetFromIconStr(GSTR3,"FORWARDMAIL",str)) {
  129.          if(str[strlen(str)-1]=='\n')    str[strlen(str)-1]='\0';
  130.          if(check) {
  131.              Load_Account(1,&tuser,&tuserkeys);
  132.              if(StringCompare(name,tuser.Name)==SUCCESS) {
  133.                  if(stat=Find_User_From_Name(1,str,&tuser,&tuserkeys)) {
  134.                      sprintf(GSTR3,"    Forwarding mail To: %s\r\n",tuserkeys.UserName);
  135.                      AEPutStr(GSTR3);
  136.                      strcpy(name,tuserkeys.UserName);
  137.                      error=1;
  138.                  }
  139.              }
  140.          } else  {
  141.              if(stat=Find_User_From_Name(1,str,&tuser,&tuserkeys)) {
  142.                  sprintf(GSTR3,"    Forwarding mail To: %s\r\n",tuserkeys.UserName);
  143.                  AEPutStr(GSTR3);
  144.                  strcpy(name,tuserkeys.UserName);
  145.                  error=1;
  146.              }
  147.          }
  148.  }
  149.  return(error);
  150. }
  151.  
  152. int CallMsgFuncs(WORD which,int pass);
  153.  
  154. int CommentToSYSOP(void)
  155. {
  156.  extern struct User tuser;
  157.  extern struct UserKeys tuserkeys;
  158.  int stat;
  159.  char str[255];
  160.  
  161.  stat=Load_Account(1,&tuser,&tuserkeys);
  162.  strcpy(MailHeader.ToName,tuser.Name);
  163.  
  164.  AEPutStr("\r\n                       (------------------------------)\r\n");
  165.  sprintf(str,"     To(Enter)='ALL'? %s\r\n",MailHeader.ToName);
  166.  AEPutStr(str);
  167.  CheckToForward(str,MailHeader.ToName,0);
  168.  AEPutStr("Subject(Blank)=abort? ");
  169.  strcpy(MailHeader.ToNet,Sopt->BBSConfig);
  170.  strcpy(MailHeader.FromNet,Sopt->BBSConfig);
  171.  stat=LineInput("",str,30,KEYBOARD_TIMEOUT);
  172. if(stat<0)  return(stat);
  173.  
  174.  if(str[0]=='\0') {
  175.      AEPutStr("\r\n");
  176.      return(SUCCESS);
  177.  }
  178.  strcpy(MailHeader.Subject,str);
  179.  MailHeader.Status[0]='R';
  180.  Comment=1;
  181.  stat=CallMsgFuncs(2,0);
  182.  if(stat<0)  return(stat);
  183.  return(SUCCESS);
  184. }
  185.  
  186. static int SecondWord(char *s)
  187. {
  188.  int loop;
  189.  
  190.  loop=FirstChar(s);
  191.  if(loop>=0)    {
  192.         for(; loop<strlen(s); loop++) {
  193.             if(s[loop]==' ')   return(loop+1);
  194.         }
  195.  }
  196.  return(-1);
  197. }
  198.  
  199. int LoadMsg(char *s)
  200. {
  201. FILE *f;
  202.  
  203.  Lines=0;
  204.  
  205.  strcpy(MsgBuf[0],s);
  206.  if(f=fopen(MsgBuf[0],"r"))  {
  207.      while(fgets(MsgBuf[Lines],90,f)!=NULL&&Lines<99) {
  208.          MsgBuf[Lines][strlen(MsgBuf[Lines])-1]='\0';
  209.          Lines++;
  210.      }
  211.      fclose(f);
  212.      return(1);
  213.  }
  214. return(0);
  215. }
  216. int SaveMsg(char *s)
  217. {
  218. FILE *f;
  219. int i=0;
  220.  if(Lines)
  221.  {
  222.    if(f=fopen(s,"w"))  {
  223.      while(Lines){
  224.          fprintf(f,"%s\n",MsgBuf[i]);
  225.          Lines--; i++;
  226.       } 
  227.      fclose(f);
  228.      return(1);
  229.    }
  230.  }
  231. return(0);
  232. }
  233.  
  234. static int EnterMSG(void)
  235. {
  236.  int AFlag;
  237.  long i,i2,i3;
  238.  BPTR rzmsglock;
  239.  char str[255],string[255];
  240.  FILE *f;
  241.  int netmail=0;
  242.  BPTR msgbaselock;
  243.  AFlag=0;
  244.  AttachedFile[0]='\0';
  245.  if(Comment==1)  {
  246.      Comment=0;
  247.      goto SkipAll;
  248.  }
  249.  if(ReplyFlag==1)    goto SkipBegin;
  250.  else {
  251.      i=CommandSplit();
  252.      if(i>1) {
  253.          if(i=SecondWord(MAINMENU_Li))
  254.           if(strlen(&MAINMENU_Li[i])<=30 && i>0)
  255.           {   
  256.              strcpy(MailHeader.ToName,MAINMENU_Li+i);
  257.              MsgToHeader();
  258.              AEPutStr(MailHeader.ToName);
  259.              AEPutStr("\r\n");
  260.              goto SkipEntry;
  261.          }
  262.         }
  263.      }
  264.  
  265.  
  266.  MsgToHeader();
  267.  stat=LineInput("",MailHeader.ToName,30,KEYBOARD_TIMEOUT);
  268.  if(stat<0)  return(stat);
  269.  
  270. SkipEntry:
  271.  
  272.  MailHeader.Status[0]='P';
  273.  if(strlen(MailHeader.ToName)==0) {
  274.      AFlag=1;
  275.      strcpy(MailHeader.ToName,"ALL");
  276.  } else {
  277.      strcpy(str,MailHeader.ToName);
  278.      strlwr(str);                           /* convert string to lower case */
  279.      stat=strncmp(str,"eall",4);            /* looking for eall             */
  280.  
  281.      if(stat==0) {
  282.            if(GET_BIT(ACS_EALL_LEVEL)) {
  283.              AFlag=2;
  284.              strcpy(MailHeader.ToName,"EALL");
  285.          } else {
  286.              AEPutStr("\r\nUser does not exist!!\r\n\r\n");
  287.              return(FAILURE);
  288.          }
  289.      } else  {
  290.          stat=strncmp(str,"sysop",5);
  291.          if(stat==0)
  292.              Load_Account(1,&tuser,&tuserkeys);
  293.          else {
  294.              if(!netflag)
  295.              {
  296.              stat=ChooseAName(MailHeader.ToName,&tuser,&tuserkeys,1);
  297.              if(stat<0)  return(stat);
  298.              }
  299.              else { strcpy(MailHeader.ToName,str); netmail=1; }
  300.          }
  301.            if(!netmail)
  302.            {
  303.          strcpy(MailHeader.ToName,tuserkeys.UserName);
  304.          if(!IsTempConf(&tuser,CN-1))  {
  305.              AEPutStr("\r\nUser does not have access to this conference!\r\n\r\n");
  306.              return(FAILURE);
  307.            }
  308.            netmail=0;
  309.          }
  310.      }
  311.  }
  312.  
  313.  CheckToForward(str,MailHeader.ToName,1);
  314.  if(netflag)
  315.  {
  316.     AEPutStr("  ToNet(Blank)N/A ? ");
  317.     stat=LineInput("",MailHeader.ToNet,7,KEYBOARD_TIMEOUT);
  318.     if(stat<0) return(stat);
  319.     if(!ValidNet((char *)&MailHeader.ToNet)) 
  320.     {
  321.       AEPutStr("This BBS does not recognize that net address\r\n\r\n");
  322.       return(FAILURE);
  323.     }
  324.     strcpy(MailHeader.FromNet,Sopt->BBSConfig);
  325.  }
  326.  AEPutStr("Subject(Blank)=abort? ");
  327.  stat=LineInput("",MailHeader.Subject,30,KEYBOARD_TIMEOUT);
  328.  if(stat<0)  return(stat);
  329.  if(strlen(MailHeader.Subject)==0) {
  330.      AEPutStr("\r\n");
  331.      return(FAILURE);
  332.  }
  333.  
  334. SkipBegin:
  335.  if(!AFlag) {
  336.      AEPutStr("         Private ");
  337.      stat=YesNo(2);
  338.      if(stat<0)  return(stat);
  339.      if(stat)     MailHeader.Status[0]='R';
  340.      else         MailHeader.Status[0]='P';
  341.  }
  342.  
  343.  if(ReplyFlag==1) {
  344.      ReplyFlag=0; 
  345.      AEPutStr("  Quote in Reply ");
  346.      stat=YesNo(2);
  347.      if(stat<0)  return(stat);
  348.      if(stat) {
  349.          sprintf(GSTR1,"%s%d",MsgBase_Location,MailHeader.MsgNumb);
  350.          if(stat=LoadMsg(GSTR1)) {
  351.              AEPutStr("\r\n");
  352.              gnsflag=0;
  353.              LineCount=0;
  354.              for(i=0; i<Lines; i++) {
  355.                  sprintf(str,"%2d> %s\r\n",i+1,MsgBuf[i]);
  356.                  AEPutStr(str);
  357.                  if(stat=CheckForPause())
  358.                      break;
  359.              }
  360.              for(;;)  {
  361.                  AEPutStr("\r\n Enter Startline,Endline or (*=ALL, A=Abort): ");
  362.                  stat=LineInput("",str,6,KEYBOARD_TIMEOUT);
  363.                  if(stat<0)  return(stat);
  364.                  stat=FirstCharValue(str);
  365.                  if(stat=='A'||stat=='a') {
  366.                      i=(-1);
  367.                      Lines=0;
  368.                      break;
  369.                  }
  370.                  if(stat=='*')  {
  371.                      i=1;
  372.                      i2=Lines;
  373.                  } else  sscanf(str,"%d,%d",&i,&i2);
  374.  
  375.                  if((i>0&&i<=Lines)&&(i2>0&&i2<=Lines)&&(i<=i2))
  376.                      break;
  377.  
  378.              }
  379.              if(i!=(-1)) {
  380.                  for(i3=0; i3<=(i2-i); i3++) {
  381.                      if(i3<98) {
  382.                         sprintf(str,">%s",MsgBuf[i+i3-1]);
  383.                         strcpy(MsgBuf[i3],str);
  384.                         }
  385.                  }
  386.                  if(i3<98)    Lines=i3;
  387.                  else         Lines=98;
  388.                  strcpy(MsgBuf[Lines++]," ");
  389.                  MsgBuf[Lines][0]='\0';
  390.              } else  {
  391.                  for(i=0; i<100; i++)
  392.                      MsgBuf[i][0]='\0';
  393.              }
  394.          }
  395.      } else {
  396.          for(i=0; i<100; i++)
  397.              MsgBuf[i][0]='\0';
  398.          Lines=0;
  399.      }
  400.  } else {
  401.  
  402. SkipAll:
  403.      for(i=0; i<100; i++)         MsgBuf[i][0]='\0';
  404.      Lines=0;
  405.  }
  406.  
  407.  stat=Edit();
  408.  if(stat==TIMEOUT||stat==NO_CARRIER)  return(stat);
  409.  
  410.  if(stat<0) {
  411.      AEPutStr("\r\n");     return(FAILURE);
  412.  }
  413.    
  414.  AEPutStr("Saving...");
  415.  MailHeader.Recv=0L;
  416.  MailHeader.MsgDate=time(NULL);
  417.  strcpy(MailHeader.FromName,User.Name);
  418.  if(msgbaselock=LockMsgBase()) {
  419.      GetMailStatFile();
  420.      MailHeader.MsgNumb=MailStat.HighMsgNum;
  421.      stat=Save_MessageHeader();
  422.      if(stat!=FAILURE) {
  423.          sprintf(string,"Message Number %ld...",MailHeader.MsgNumb);
  424.          AEPutStr(string);
  425.          sprintf(GSTR3,"%s%ld",MsgBase_Location,MailHeader.MsgNumb);
  426.          if(!(f=fopen(GSTR3,"w"))) {
  427.              AEPutStr("Failed!\r\n\r\n"); rzmsg=NULL;
  428.              return(FAILURE);
  429.          }
  430.          for(i=0; i<Lines; i++)
  431.              fprintf(f,"%s\n",MsgBuf[i]);
  432.          fclose(f);
  433.          AEPutStr("done!\r\n\r\n");
  434.  
  435.          if(AttachedFile[0]!='\0') {
  436.              SetComment(GSTR3,AttachedFile);
  437.              AttachedFile[0]='\0';
  438.          }
  439.      } else    AEPutStr("Failed!\r\n\r\n");
  440.      UnLock(msgbaselock);
  441.     if(rzmsg)
  442.     {
  443.        sprintf(GSTR1,"%sF%ld",MsgBase_Location,MailHeader.MsgNumb);
  444.        if(rzmsglock=CreateDir(GSTR1)) UnLock(rzmsglock);
  445.        SetEnvStat(ENV_UPLOADING); 
  446.        AEPutStr("\r\n");           /* 11w */
  447.              stat    = Upload_a_File(0); rzmsg=NULL;
  448.              sprintf(GSTR1,"%sF%ld",MsgBase_Location,MailHeader.MsgNumb);
  449.              DeleteFile(GSTR1);
  450.              if(stat == GOODBYE) { fileattach=FALSE;
  451.                  Goodbye();
  452.                  return(STANDARD_LOGOFF);
  453.              }
  454.              if(stat == NO_CARRIER) {
  455.                  return(NO_CARRIER);
  456.              }
  457.              return(stat);
  458.     }
  459.  } else
  460.      AEPutStr("ERROR! Another task has the MsgBase locked!\r\nMessage has not been saved!\r\n\r\n");
  461.  rzmsg=NULL;
  462.   return(SUCCESS);
  463. }
  464.  
  465.  int Edit(void)
  466. {
  467.  register int c;
  468.  int cn,j,x,back,BKFlag,helplist=0;
  469.  static char str[200],SPACE[90],str2[10],temp[170];
  470.  
  471. /* Clear msg buffer */
  472.  rzmsg=NULL;
  473.  str[0]='\0';
  474.  x=0;
  475.  BKFlag=0;
  476.  sprintf(str,"%sCommands/SysCmd/FULLEDIT.info",Cmds->BBSLoc);
  477.  if(!access(str,00) && GET_BIT(ACS_FULLEDIT) && User.EditorType!=1)
  478.  {
  479.  
  480.    if(User.EditorType!=2)
  481.    { AEPutStr("FullScreen Editor");
  482.      stat=YesNo(2);
  483.    } else stat=1; 
  484.   if(stat>0)
  485.    {
  486.      EditorStruct.EditorIncludeFile=0L;
  487.      sprintf(GSTR2,"%sNode%d/Work/msg.i",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
  488.      if(SaveMsg(GSTR2)) EditorStruct.EditorIncludeFile=(ULONG)&GSTR2;
  489.      sprintf(str,"%sCommands/SysCmd/",Cmds->BBSLoc);
  490.      sprintf(GSTR1,"%sNode%d/Work/msg",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
  491.      EditorStruct.EditorFile=(ULONG)&GSTR1;
  492.      EditorStruct.EditorPrependFile=0L;
  493.      EditorStruct.EditorPostPendFile=0L;
  494.      EditorStruct.EditorAllowLoad=0;
  495.      EditorStruct.EditorAllowAbort=1;
  496.      EditorStruct.EditorMaxWidth=75;
  497.      EditorStruct.EditorAnsiColor=AnsiColor;
  498.      EditorStruct.EditorTop=1;
  499.      EditorStruct.MaxScrLength=User.LineLength;
  500.      EditorStruct.MaxFileLength=100;
  501.      if(CustomCommand(str,"FULLEDIT",1))
  502.      {
  503.         if(LoadMsg(GSTR1))
  504.         {
  505.              User.Messages_Posted++;
  506.            DeleteFile(GSTR1);
  507.            DeleteFile(GSTR2);
  508.   if(fileattach && GET_BIT(ACS_PRI_MSGFILES) || GET_BIT(ACS_PUB_MSGFILES))
  509.      {
  510.      AEPutStr("Upload to Message Base");
  511.      stat=YesNo(2); if(stat>0) rzmsg=1;
  512.      }
  513.            return(SUCCESS);
  514.         }    
  515.         DeleteFile(GSTR2);
  516.         return(-1);
  517.      }
  518.    }
  519.  }
  520.  AEPutStr("\r\n");
  521.  AEPutStr("   Enter your text. (Enter) alone to end. (75 chars/line, 100 lines, max)\r\n");
  522.  AEPutStr("   (|-------|-------|-------|-------|-------|-------|-------|-------|-------|--)\r\n");
  523. if(Lines!=0)
  524.     {
  525.     for(j=0; j<Lines; j++)
  526.         {
  527.         sprintf(SPACE,"%2d> %s\r\n",j+1,MsgBuf[j]);
  528.         AEPutStr(SPACE);
  529.         }
  530.     }
  531. /*removed (JOE)
  532.  
  533.  if(Lines!=0) {
  534.      for(j=0; j<Lines; j++) {
  535.          sprintf(SPACE,"%2d> %s\r\n",j+1,MsgBuf[j]);
  536.          AEPutStr(SPACE);
  537.      }
  538.  }
  539. */
  540.  SPACE[0]='\0';
  541.  
  542.  do {
  543.      BEG_IN:
  544.      strcpy(MsgBuf[Lines],SPACE);
  545.      sprintf(str,"%2d> %s",Lines+1,MsgBuf[Lines]);
  546.      AEPutStr(str);
  547.  
  548.      for(;;) {
  549.          Next2:
  550.  
  551.  
  552.          c=ReadChar(KEYBOARD_TIMEOUT);
  553.          if(c<0)  return(c);
  554.          /*if(c==('X'-'A'+1))
  555.          {
  556.            sprintf(GSTR1,"%sNode%d/PlayPen/",Cmds->BBSLoc,Cmds->AcLvl[VL_NODE_NUMBER]);
  557.            if(Zmodem_Receive(GSTR1,0))
  558.            MsgFiles();
  559.            goto Next2;
  560.          }*/
  561.          if(c=='\r') {
  562.              if(SPACE[0]=='\0') {
  563.                  MsgBuf[Lines][0]='\0';
  564.                  BKFlag=1;
  565.                  break;
  566.              }
  567.              strcpy(MsgBuf[Lines],SPACE);
  568.              SPACE[0]='\0';
  569.              AEPutStr("\r\n");
  570.              x=0;
  571.              break;
  572.          }
  573.          if(c=='\30') {
  574.              while(x) {
  575.                  AEPutStr("\b \b");
  576.                  --x;
  577.              }
  578.              SPACE[x]='\0';
  579.              goto Next2;
  580.          }
  581.          if(c=='\b' || c=='\177') {
  582.              if(x>0) {
  583.                  x-=1;
  584.                  SPACE[x]='\0';
  585.                  AEPutStr("\b \b");
  586.                  goto Next2;
  587.              }
  588.              goto Next2;
  589.          }
  590.          if(c=='\t') {
  591.              c=x%8;
  592.              if(x+(8-c)>72)       c='\t';
  593.              else {
  594.                  for(;c<8; c++) {
  595.                      str2[0]=(char)' ';
  596.                      str2[1]='\0';
  597.                      SendChar(' ');
  598.                      strcat(SPACE,str2);
  599.                      x++;
  600.                  }
  601.              }
  602.          }
  603.          if(c<' ')
  604.              goto Next2;
  605.  
  606.          x+=1;
  607.          SendChar(c);
  608.          str2[0]=(char)c;
  609.          str2[1]='\0';
  610.          strcat(SPACE,str2);
  611.          if(x>75) {
  612.              back=0;
  613.              for(cn=x; cn>=0; cn--)  {
  614.                  if(SPACE[cn-1]==' ') {
  615.                      back=x-cn;
  616.                      SPACE[cn-1]='\0';
  617.                      break;
  618.                  }
  619.              }
  620.              if(back==0) {
  621.                  strcpy(MsgBuf[Lines],SPACE);
  622.                  AEPutStr("\r\n");
  623.                  SPACE[0]='\0';
  624.                  x=0;
  625.                  break;
  626.              }
  627.              str[0]='\0';
  628.              for(cn=(x-back); cn<x; cn++) {
  629.                  str2[0]=SPACE[cn];
  630.                  str2[1]='\0';
  631.                  strcat(str,str2);
  632.              }
  633.              x=strlen(str);
  634.              strcpy(MsgBuf[Lines],SPACE);
  635.              strcpy(SPACE,str);
  636.              for(cn=0; cn<x; cn++)
  637.                  AEPutStr("\b \b");
  638.              AEPutStr("\r\n");
  639.              break;
  640.          }
  641.      }
  642.  
  643.      Lines+=1;
  644.      if(Lines==98&&BKFlag==0)
  645.          AEPutStr("\r\nWarning two lines remaining.\r\n\r\n");
  646.  
  647.  } while(BKFlag==0&&Lines<100);
  648.  
  649.  if(Lines<100)    Lines-= 1;
  650.  else             Lines = 100;
  651.  
  652.  AEPutStr("\r\n");
  653.  
  654.  do {
  655.       if(!helplist)
  656.       {
  657.        AEPutStr("\r\nMsg. Options: A,C,D,E");
  658.        if(GET_BIT(ACS_ATTACH_FILES) && fileattach)                 AEPutStr(",F");
  659.        AEPutStr(",L,S");
  660.        if(fileattach && (MailHeader.Status[0]=='P' && GET_BIT(ACS_PUB_MSGFILES)) || (GET_BIT(ACS_PRI_MSGFILES) && MailHeader.Status[0]!='P'))
  661.        AEPutStr(",X");
  662.        AEPutStr(",>:");
  663.       }
  664.       else
  665.       {
  666.          AEPutStr("\r\nA>bort");
  667.          AEPutStr("\r\nC>ontinue");
  668.          AEPutStr("\r\nD>elete Lines");
  669.          AEPutStr("\r\nE>dit");
  670.          if(fileattach && GET_BIT(ACS_ATTACH_FILES))               
  671.           AEPutStr("\r\nF>ile Attachment");
  672.          AEPutStr("\r\nL>ist");
  673.          AEPutStr("\r\nS>ave");
  674.           if(fileattach && (MailHeader.Status[0]=='P' && GET_BIT(ACS_PUB_MSGFILES)) || (GET_BIT(ACS_PRI_MSGFILES) && MailHeader.Status[0]!='P'))
  675.             AEPutStr("\r\nX>fer Files");
  676.          AEPutStr("\r\n >: ");
  677.          helplist=0;
  678.       }
  679.      stat=LineInput("",str,10,KEYBOARD_TIMEOUT);
  680.      if(stat<0)      break;
  681.      if(str[0]=='?') { helplist=1; continue; }
  682.      if(str[0]=='D'||str[0]=='d') {
  683.          do {
  684.              if(Lines==0) {
  685.                  AEPutStr("\r\nNo lines to delete.\r\n");
  686.                  stat=0;
  687.                  break;
  688.              }
  689. /*
  690.              if(Lines==89)   Lines+=1;
  691. */
  692.              sprintf(str,"\r\nLine number to delete [1..%d]? ",Lines);
  693.              AEPutStr(str);
  694.              stat=LineInput("",str,5,KEYBOARD_TIMEOUT);
  695.              if(stat<0)  break;
  696.              if(str[0]=='\0') { stat=0; break; }
  697.              sscanf(str,"%d",&stat);
  698.  
  699.              if(stat<1||stat>Lines)  {
  700.                  sprintf(str,"\r\nLine %d does not exist.\r\n",stat);
  701.                  AEPutStr(str);
  702.              }
  703.          } while(stat<1||stat>Lines);
  704.  
  705.          if(stat<0)  break;
  706.          if(stat==0) continue;
  707.          sprintf(str,"\r\n%2d> %s\r\n",stat,MsgBuf[stat-1]);
  708.          AEPutStr(str);
  709.          AEPutStr("\r\nIs this the correct line (Y/N)? ");
  710.          cn=YesNo(0);
  711.          if(cn<0)  break;
  712.  
  713.          if(cn) {
  714.              for(j=(stat-1); j<Lines; j++)
  715.                      strcpy(MsgBuf[j],MsgBuf[j+1]);
  716.  
  717.              sprintf(str,"\r\nDeleted line %d.\r\n",stat);
  718.              Lines-=1;
  719.              AEPutStr(str);
  720.          }
  721.          continue;
  722.      }
  723.  
  724.      if(str[0]=='C'||str[0]=='c') {
  725.          AEPutStr("\r\n");
  726.          Lines-=1;
  727.          if(Lines<0)   Lines=0;
  728.          strcpy(SPACE,MsgBuf[Lines]);
  729.          BKFlag=0;
  730.          x=strlen(SPACE);
  731.          goto BEG_IN;
  732.      }
  733.      if(str[0]=='E'||str[0]=='e') {
  734.          if(Lines<1) {
  735.              AEPutStr("\r\nNo Lines to edit!\r\n");
  736.              continue;
  737.          }
  738. LoopHere:
  739.          sprintf(str,"\r\nLine number to edit [1..%d]? ",Lines);
  740.          AEPutStr(str);
  741.  
  742.          stat=LineInput("",str,5,KEYBOARD_TIMEOUT);
  743.          if(stat<0)              return(TIMEOUT);
  744.          if(str[0]=='\0')            continue;
  745.  
  746.          sscanf(str,"%d",&x);
  747.          if(x<1||x>Lines) {
  748.              sprintf(str,"\r\nLine %d does not exist.\r\n",x);
  749.              AEPutStr(str);
  750.              goto LoopHere;
  751.          }
  752.          sprintf(SPACE,"\r\n%2d> %s\r\n",x,MsgBuf[x-1]);
  753.          AEPutStr(SPACE);
  754.          AEPutStr("\r\n    Old string;New string");
  755.          AEPutStr("\r\n   (------------------------------------------------------------)");
  756.          AEPutStr("\r\n   :");
  757.  
  758.          stat=LineInput("",str,60,KEYBOARD_TIMEOUT);
  759.          if(stat<0)          return(TIMEOUT);
  760.          if(str[0]=='\0')    continue;
  761.  
  762.          stat=ProcessLine(str,MsgBuf[x-1],temp);
  763.          if(stat==0) {
  764.              AEPutStr("\r\nString not found!\r\n");
  765.              continue;
  766.          } else {
  767.              AEPutStr("\r\n    NewLine:\r\n    --------\r\n   >");
  768.              AEPutStr(temp);
  769.              AEPutStr("\r\n\r\nCorrect ");
  770.  
  771.              stat=YesNo(1);
  772.              if(stat<0)   return(stat);
  773.              if(!stat)       continue;
  774.  
  775.              strcpy(MsgBuf[x-1],temp);
  776.          }
  777.          continue;
  778.      }
  779.  
  780.      if(str[0]=='L'||str[0]=='l') {
  781.          AEPutStr("\r\n");
  782.          for(j=0; j<Lines; j++) {
  783.              sprintf(SPACE,"%2d> %s\r\n",j+1,MsgBuf[j]);
  784.              AEPutStr(SPACE);
  785.          }
  786.          continue;
  787.      }
  788.  
  789.      if(str[0]=='F'||str[0]=='f') {
  790.          if(GET_BIT(ACS_ATTACH_FILES) && fileattach) {
  791.              for(;;) {
  792.                  if(XIMPort==CONSOLE_PORT) asl(AttachedFile); else
  793.                  {
  794.                  AEPutStr("\r\nEnter path/filename to attach ('5 <DIR>'=DIR): ");
  795.                  stat=LineInput("",AttachedFile,250,KEYBOARD_TIMEOUT);
  796.                  if(stat<0)      return(stat);
  797.                  if(AttachedFile[0]=='5'&&AttachedFile[1]==' ') {
  798.                      strcpy(MAINMENU_Li,AttachedFile);
  799.                      AttachedFile[0]='\0';
  800.                      MyDirAnyWhere();
  801.                      continue;
  802.                  }
  803.                  }
  804.                  if(AttachedFile[0]!='\0') {
  805.  
  806.                      strlwr(AttachedFile);
  807.                       if(FindAssign(AttachedFile))
  808.           {
  809.              AEPutStr("\r\nDevice not Mounted.\r\n");
  810.              AEPutStr("\r\n");
  811.              AttachedFile[0]='\0'; continue;
  812.           }
  813.                      if(Restricted(AttachedFile)){AttachedFile[0]='\0'; continue; }
  814.                       else{
  815.   AEPutStr("Delete file when message is deleted ");
  816.                         stat=YesNo(2);
  817.                         if(stat<0)   {  return(stat);  }
  818.                               strlwr(AttachedFile);
  819.                         if(stat){  AttachedFile[0]=toupper(AttachedFile[0]); }
  820.                       }
  821.                  }
  822.                  break;
  823.              }
  824.          } else
  825.              AEPutStr("\r\nCommand requires higher access.\r\n");
  826.  
  827.      }
  828.      if(str[0]=='S'||str[0]=='s') {
  829.          User.Messages_Posted++;
  830.          return(SUCCESS);
  831.      }
  832.      if(fileattach && (str[0]=='X'||str[0]=='x') && (GET_BIT(ACS_PRI_MSGFILES) || GET_BIT(ACS_PUB_MSGFILES)))
  833.      {
  834.        rzmsg=1;
  835.        User.Messages_Posted++;
  836.        return(SUCCESS);
  837.      }
  838.      if(str[0]=='A'||str[0]=='a') {
  839.          AEPutStr("\r\nAbort message entry (y/n)? ");
  840.          stat=YesNo(0);
  841.          if(stat<0)          break;
  842.          
  843.          if(stat)            return(-1); 
  844.      }
  845.  } while(stat>=0);
  846.  return(stat);
  847. }
  848.  
  849.  
  850. static int Load_MessageHeader(void)
  851. {
  852. long HeadPoint,size,FilePos,error,temp;
  853.  HeadPoint=MSGNUM-MailStat.LowestKey;
  854.  size=(long)sizeof(struct MailHeader);
  855.  FilePos=(long)size*(long)HeadPoint;
  856.  temp=FilePos-CurrentSeekPos;
  857.  if(temp) {
  858.      error=Seek(gfh,temp,OFFSET_CURRENT);
  859.      if(error<0) {
  860.          MyError(2);
  861.          return(FAILURE);
  862.      }
  863.  }
  864.  
  865.   error=FRead(gfh,(char *)&MailHeader,sizeof(struct MailHeader),1);
  866.  if(error!=1) {
  867.      MyError(2);
  868.      return(FAILURE);
  869.  }
  870.  
  871.  CurrentSeekPos=Seek(gfh,0,OFFSET_CURRENT);
  872.  return(SUCCESS);
  873. }
  874.  
  875. static int Save_OverHeader(void)
  876. {
  877.  long HeadPoint,size,FilePos,error,temp;
  878.  
  879.  HeadPoint=DelMSGNUM-MailStat.LowestKey;
  880.  size=(long)sizeof(struct MailHeader);
  881.  FilePos=(long)size*(long)HeadPoint;
  882.  temp=FilePos-CurrentSeekPos;
  883.  
  884.  error=Seek(gfh,temp,OFFSET_CURRENT);
  885.  if(error<0) {
  886.      MyError(2);
  887.      return(FAILURE);
  888.  }
  889.  
  890.  error=Write(gfh,(char *)&MailHeader,sizeof(struct MailHeader));
  891.  if(error!=sizeof(struct MailHeader))    {
  892.      MyError(2);
  893.      return(FAILURE);
  894.  }
  895.  Seek(gfh,CurrentSeekPos,OFFSET_BEGINNING);
  896.  return(SUCCESS);
  897. }
  898.  
  899. static int CheckAttachedFile(long msgnumb,int flag)
  900. {
  901.  int stat;
  902.  char str[250];
  903.  struct FileInfoBlock *FBlock;
  904.  BPTR FLock;
  905.  int filetype=0;
  906.  GSTR1[0]='\0';
  907.  
  908.  DTBT=0;
  909.  TBT=0;
  910.  TTTM=NULL;
  911.  TTEFF=NULL;
  912.  TTCPS=NULL;
  913.  
  914.  sprintf(str,"%s%ld",MsgBase_Location,msgnumb);
  915.  
  916.  if(FBlock=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) {
  917.         if(FLock=Lock(str,ACCESS_READ))    
  918.          {
  919.           if(Examine(FLock,FBlock)) {
  920.              if(FBlock->fib_Comment[0]!='\0'){
  921.                  strcpy(GSTR1,FBlock->fib_Comment); filetype=1;
  922.              }
  923.             
  924.            }
  925.          UnLock(FLock);
  926.             if(filetype==0)
  927.            {
  928.             sprintf(str,"%sF%ld",MsgBase_Location,msgnumb);
  929.             if(FLock=Lock(str,ACCESS_READ))
  930.             {
  931.               UnLock(FLock); filetype=2;
  932.             }
  933.            }
  934.          }
  935.         FreeDosObject(DOS_FIB,FBlock);
  936.     }
  937.      
  938.        
  939.  if(filetype) {
  940.      if(flag) {
  941.             AEPutStr("...This message has an attached file(s), Download? (y/N/goodbye)? ");
  942.              stat=ReadChar(KEYBOARD_TIMEOUT);
  943.                 if(stat<0)
  944.                  return(stat);
  945.                if(stat=='n' || stat=='N')AEPutStr("No\r\n");
  946.                if(stat=='y' || stat=='Y')
  947.                {
  948.                      AEPutStr("Yes\r\n\r\n");
  949.                          if(filetype==2)AttachMsgFiles(msgnumb,GSTR1);
  950.                          
  951.                         Zmodem_Send(GSTR1);
  952.                }
  953.                if(stat=='g' || stat=='G')
  954.                {
  955.                      AEPutStr("Goodbye\r\n\r\n");
  956.                          if(filetype==2)AttachMsgFiles(msgnumb,GSTR1);
  957.                         Zmodem_Send(GSTR1);
  958.                         AEPutStr("\r\n");
  959.                         stat=PGoodbye();
  960.                         if(stat==GOODBYE) ModemOffHook();
  961.                      return(stat);
  962.                }
  963.  
  964.                      
  965.                         stat=0;
  966.          AEPutStr("\r\n");
  967.         } else    {
  968.           
  969.           if(filetype==2) DeleteMsgFiles(msgnumb);
  970.          stat=isupper(GSTR1[0]);
  971.             if(stat) {
  972.              DeleteFile(GSTR1);
  973.                 AEPutStr("\r\nDeleted attached file(s) ");
  974.                 AEPutStr(GSTR1);
  975.            }
  976.         }
  977.     }
  978.  return(SUCCESS);
  979. }
  980.  
  981. static int DeleteMSG(void)
  982. {
  983. char string[255];
  984. BPTR msgbaselock;
  985.  
  986.  if(User.Sec_Status<210) {
  987.         if(StringCompare(MailHeader.FromName,User.Name)==SUCCESS)
  988.             goto GoAheadDel;
  989.         if(StringCompare(MailHeader.ToName,User.Name)==SUCCESS)
  990.             goto GoAheadDel;
  991.         AEPutStr("\r\nMessage not deleted, not your mail.\r\n\r\n");
  992.         return(FAILURE);
  993.     }
  994.  
  995. GoAheadDel:
  996.  if(msgbaselock=LockMsgBase()) {
  997.        GetMailStatFile();
  998.     DelMSGNUM=MSGNUM-FWDFlag;
  999.     if(MailStat.LowestNotDel==DelMSGNUM)    MailStat.LowestNotDel+=1;
  1000.     stat=SaveStatOnly();
  1001.     MailHeader.Status[0]='D';
  1002.     CheckAttachedFile(DelMSGNUM,0);
  1003.     sprintf(string,"%s%ld",MsgBase_Location,DelMSGNUM);
  1004.     stat=DeleteFile(string);
  1005.     stat=Save_OverHeader();
  1006.     sprintf(string,"\r\nMessage %d deleted...\r\n",DelMSGNUM);
  1007.     AEPutStr(string);
  1008.     UnLock(msgbaselock);
  1009.  }
  1010.  else  AEPutStr("Can't Lock MsgBase, Message not Deleted!\r\n");
  1011.  return(SUCCESS);
  1012. }
  1013.  
  1014. #ifdef RTS
  1015. int ChooseAName(char *s,struct User *hoozer,struct UserKeys *hoozer2,int lflag)
  1016. {
  1017. int stat;
  1018. UWORD i;
  1019.  
  1020.  i=1;
  1021.  do {
  1022.      stat=Find_User_From_Name(i,s,hoozer,hoozer2);
  1023.      if(stat==0) {
  1024.          if(lflag)  AEPutStr("\r\nUser does not exist!!\r\n\r\n");
  1025.          return(FAILURE);
  1026.      }
  1027.      if(stat=CheckForAst(s)) {
  1028.          AEPutStr(" Expand: ");
  1029.          AEPutStr(hoozer2->UserName);
  1030.          AEPutStr(" Correct ");
  1031.          stat=YesNo(1);
  1032.          if(stat<0)          return(stat);
  1033.          if(!stat) {
  1034.              if(AnsiColor)    AEPutStr("A");
  1035.              stat=1;
  1036.              i=(hoozer2->Number)+1;
  1037.          } else  stat=0;
  1038.  
  1039.      } else   stat=0;
  1040.  } while(stat);
  1041.  Load_Account(hoozer2->Number,hoozer,hoozer2);
  1042.  return(1);
  1043. }
  1044. #endif
  1045.  
  1046.  
  1047. static int DisplayMessage(void)
  1048. {
  1049.  long TimeVar;
  1050.  char str[255],string[255],date[100];
  1051.  
  1052.  TimeVar=(long)MailHeader.MsgDate;
  1053.  sprintf(date,"%s",ctime(&TimeVar));
  1054.  date[strlen(date)-1]='\0';
  1055.  
  1056.  if(GET_BIT(ACS_CLEAR_SCREEN_MSG)) SendChar(12);
  1057.  
  1058.  sprintf(str,"\r\nDate   %-30s   Number%ld\r\n",date,MailHeader.MsgNumb);
  1059.  AEPutStr(str);
  1060.  strcpy(date,MailHeader.ToName);
  1061.  strlwr(date);
  1062.  TimeVar=(long)strncmp(date,"eall",4);
  1063.  if(TimeVar==0) {
  1064.   strcpy(date,User.Name);
  1065.      strcat(date," (ALL)");
  1066.  } else
  1067.       strcpy(date,MailHeader.ToName);
  1068.  
  1069.  if(netflag)
  1070.  {
  1071.  sprintf(str,"To     %-30s  Address%-6.6s\r\n",date,MailHeader.ToNet);
  1072.  }
  1073.  else
  1074.  sprintf(str,"To     %-30s  ",date);
  1075.  AEPutStr(str);
  1076.  if(!netflag)
  1077.  {
  1078.  if(MailHeader.Recv!=0) {
  1079.      TimeVar=MailHeader.Recv;
  1080.      sprintf(date,"%s",ctime(&TimeVar));
  1081.      date[strlen(date)-1]='\0';
  1082.      sprintf(str," Recv'd%s\r\n",date);
  1083.      AEPutStr(str);
  1084.  } else {
  1085.      AEPutStr(" Recv'd");
  1086.      if(StringCompare(MailHeader.ToName,"ALL")==SUCCESS)
  1087.           AEPutStr("N/A\r\n");
  1088.      else
  1089.           AEPutStr("No\r\n");
  1090.  }
  1091.  
  1092.  if(MailHeader.Status[0]=='P')
  1093.      strcpy(string,"Public Message");
  1094.  else
  1095.      strcpy(string,"Private");
  1096.  
  1097.  sprintf(str,"From   %-30s   Status%s\r\n",MailHeader.FromName,string);
  1098.  AEPutStr(str);
  1099.  sprintf(str,"Subject%s\r\n\r\n",MailHeader.Subject);
  1100.  AEPutStr(str);
  1101.  }
  1102.  else
  1103.  {
  1104.  if(MailHeader.Status[0]=='P')
  1105.      strcpy(string,"Public Message");
  1106.  else
  1107.      strcpy(string,"Private");
  1108.  
  1109.  sprintf(str,"From   %-30s  Address%-6.6s\r\n",MailHeader.FromName,MailHeader.FromNet);
  1110.  AEPutStr(str);
  1111.  sprintf(str,"Status %-30s   Recv'd",string);
  1112.  if(MailHeader.Recv!=0) {
  1113.      TimeVar=MailHeader.Recv;
  1114.      sprintf(date,"%s",ctime(&TimeVar));
  1115.      date[strlen(date)-1]='\0';
  1116.      strcat(str,date);strcat(str,"\r\n");
  1117.      AEPutStr(str);
  1118.  } else {
  1119.      if(StringCompare(MailHeader.ToName,"ALL")==SUCCESS)
  1120.           strcat(str,"N/A\r\n");
  1121.      else
  1122.           strcat(str,"No\r\n");
  1123.      AEPutStr(str);
  1124.  }
  1125.   sprintf(str,"Subject%s\r\n\r\n",MailHeader.Subject);
  1126.   AEPutStr(str);
  1127.  }
  1128.  
  1129.  AlreadyRecvd=MailHeader.Recv;
  1130.  
  1131.  if(StringCompare(MailHeader.ToName,User.Name)==SUCCESS) {
  1132.      if(MailHeader.Recv==0)  {
  1133.       MailHeader.Recv=time(NULL);
  1134.          DelMSGNUM=MailHeader.MsgNumb;
  1135.          Save_OverHeader();
  1136.      }
  1137.  }
  1138.  
  1139.  sprintf(GSTR3,"%s%ld",MsgBase_Location,MailHeader.MsgNumb);
  1140.  
  1141.  if(NonStop) {
  1142.   stat=MenuSend(GSTR3);
  1143.      if(stat==FAILURE)
  1144.           NonStop=0;
  1145.  } else {
  1146.       gnsflag=0;                                  /* 11w */
  1147.       (void)MenuSend24(GSTR3,5);
  1148.  }
  1149.  
  1150.      stat=CheckAttachedFile(MailHeader.MsgNumb,1);
  1151.      return(stat);
  1152.  
  1153. }
  1154.  
  1155. static void EditEMessage(long number)
  1156. {
  1157.  sprintf(GSTR1,"%s%d",MsgBase_Location,number);
  1158.  EditEmacs(GSTR1);
  1159. }
  1160.  
  1161. /* 11w addition */
  1162. int GetAValidName(char *Name,char *Default,char *str)
  1163. {
  1164.  
  1165.  if(strlen(Name)==0) {
  1166.         strcpy(str,Default); return(0);
  1167.  }
  1168.  strcpy(str,Name);
  1169.  strlwr(str);
  1170.  if(!strncmp(str,"all",3))  {
  1171.      strupr(str); return(1);
  1172.  }
  1173.  if(!strncmp(str,"eall",4))  {
  1174.      strupr(str); return(1);
  1175.  }
  1176.  if(!strncmp(str,"sysop",5))
  1177.         Load_Account(1,&tuser,&tuserkeys);
  1178.     else {
  1179.         stat=ChooseAName(Name,&tuser,&tuserkeys,1);
  1180.         if(stat<0)    {
  1181.             *(str)='\0';return(0);
  1182.         }
  1183.     }
  1184.  
  1185.     strcpy(str,tuserkeys.UserName);
  1186.     if(!IsTempConf(&tuser,CN-1))    {
  1187.      AEPutStr("\r\nUser does not have access to this conference, try another!\r\n\r\n");
  1188.        *(str)='\0';return(0);
  1189.  }
  1190.  return(0);
  1191. }
  1192. /* 11w addition */
  1193.  
  1194. static int EditHeader(void)
  1195. {
  1196.  int AFlag;
  1197.  struct MailHeader MH;
  1198.  char string[200];
  1199.  
  1200.  MH=MailHeader;
  1201.  MH.Status[0]='P';
  1202.  AEPutStr("\r\n");
  1203.  sprintf(string,"     From(Enter)='%s'? ",MailHeader.FromName);
  1204.  AEPutStr(string);
  1205.  stat=LineInput("",string,30,KEYBOARD_TIMEOUT);
  1206.  if(stat<0)  return(stat);
  1207.  AFlag=GetAValidName(string,MailHeader.FromName,MH.FromName);
  1208.  
  1209.  if(MH.FromName[0]=='\0') return(2);
  1210.  
  1211.  if(AFlag) {
  1212.    AEPutStr("Invalid From Name. Aborting.\r\n");
  1213.    return(2);
  1214.  }
  1215.  sprintf(string,"       To(Enter)='%s'? ",MailHeader.ToName);
  1216.  AEPutStr(string);
  1217.  stat=LineInput("",string,30,KEYBOARD_TIMEOUT);
  1218.  if(stat<0)  return(stat);
  1219.  AFlag=GetAValidName(string,MailHeader.ToName,MH.ToName);
  1220.  
  1221.  if(MH.ToName[0]=='\0') return(2);
  1222.  sprintf(string,"  Subject(Enter)='%s'? ",MailHeader.Subject);
  1223.  AEPutStr(string);
  1224.  stat=LineInput("",string,30,KEYBOARD_TIMEOUT);
  1225.  if(stat<0) return(stat);
  1226.  if(string[0]>=' ') strcpy(MH.Subject,string);
  1227.  
  1228.  if(!AFlag) {
  1229.      AEPutStr("         Private ");
  1230.         stat=YesNo(2);
  1231.      if(stat<0)  return(stat);
  1232.         if(stat)        MH.Status[0]='R';
  1233.      else            MH.Status[0]='P';
  1234.     }
  1235.  
  1236.  MH.Recv = 0L;
  1237.  MailHeader=MH;
  1238.  DelMSGNUM=MSGNUM-FWDFlag;
  1239.  Save_OverHeader();
  1240.  return(1);
  1241. }
  1242.  
  1243. static int ReplyToMSG(void);
  1244.  
  1245. static int READMsg(void)
  1246. {
  1247.  int UNum,helplist=0;
  1248.  char str[255],string[255];
  1249.  
  1250.  NonStop=ReplyFlag=TEMPFlag=NumOfZMsgs=0;
  1251.  FWDFlag=1;
  1252.  FWDDir='+';
  1253.  MSGNUM=Last_Msg_Read_Conf+1;
  1254.  if(MSGNUM<MailStat.LowestKey) MSGNUM=MailStat.LowestKey;
  1255.  AEPutStr("\r\n");
  1256.  
  1257.  stat=CommandSplit();
  1258.  if(stat>1) {
  1259.   if((Command[stat-1][0]=='N'||Command[stat-1][0]=='n')&&(Command[stat-1][1]=='S'||Command[stat-1][1]=='s'))
  1260.      NonStop=1;
  1261.  
  1262.  if(Command[1][0]=='S'||Command[1][0]=='s') {
  1263.      if(MSGNUM>(MailStat.HighMsgNum-1)) {
  1264.          AEPutStr("No new messages.\r\n");
  1265.          AEPutStr("\r\n");
  1266.          return(FAILURE);
  1267.      }
  1268.      goto GoNextMsg;
  1269.  }
  1270.  stat=FirstChar(Command[1]);
  1271.  if(stat>=0) {
  1272.      if(Command[1][stat]=='-'||Command[1][stat]=='+'||isdigit(Command[1][stat])) {
  1273.          strcpy(str,Command[1]);
  1274.          goto PassItIN;
  1275.      }
  1276.  }
  1277. }
  1278.  
  1279. NoPass:
  1280.  
  1281.  FOREVER {
  1282.      BackPrompt:
  1283.      if(FWDFlag==1)   sprintf(str,"%ld%c%ld",MSGNUM,FWDDir,MailStat.HighMsgNum-1);
  1284.      else             sprintf(str,"%ld%c%ld",MSGNUM,FWDDir,MailStat.LowestKey);
  1285.  
  1286.      if((MSGNUM>(MailStat.HighMsgNum-1))||(MSGNUM<MailStat.LowestKey))
  1287.          strcpy(str,"QUIT");
  1288. //(RTS)
  1289. if(!helplist)
  1290.       {
  1291.        if(NonStop==0)
  1292.        {
  1293.        AEPutStr("\r\nMsg. Options: A,D");
  1294.        AEPutStr(",R,Q");
  1295.        sprintf(string,",?,<CR( %s )>: ",str);
  1296.        AEPutStr(string);
  1297.        }
  1298.       }
  1299.       else
  1300.       {
  1301.          AEPutStr("\r\nA>gain");
  1302.          AEPutStr("\r\nD>elete Message");
  1303.          AEPutStr("\r\nR>eply");
  1304.          AEPutStr("\r\nQ>uit");
  1305.          sprintf(string,"\r\n<CR>=Next ( %s )? ",str);
  1306.          AEPutStr(string);
  1307.          helplist=0;
  1308.       }
  1309.    
  1310.      if(NonStop==0)  {
  1311.          NoDirF=1;
  1312.          stat=LineInput("",str,10,KEYBOARD_TIMEOUT);
  1313.          if(stat<0) return(stat);
  1314.      }
  1315.     
  1316.      if(str[0]=='?') { helplist=1; continue; }
  1317.      if((str[0]=='N'||str[0]=='n')&&(str[1]=='S'||str[1]=='s'))
  1318.          NonStop=1;
  1319.  
  1320.      if((strlen(str)==0)||(NonStop))  {
  1321.          NoDirF=1;     goto GoNextMsg;
  1322.      }
  1323.      if(TEMPFlag) {
  1324.          if((PrivateFlag==0)||(StringCompare(MailHeader.ToName,User.Name)== \
  1325.           SUCCESS)||(StringCompare(MailHeader.FromName,User.Name)==SUCCESS)){
  1326.           if(!netflag || !strcmp(Sopt->BBSConfig,MailHeader.ToNet) || !strcmp(Sopt->BBSConfig,MailHeader.FromNet)
  1327.              || GET_BIT(ACS_SYSOP_READ) || PrivateFlag==0)
  1328.           { 
  1329.              switch(tolower(str[0])) {
  1330.                  case 'a':
  1331.                      stat=DisplayMessage();
  1332.                      if(stat<0)  return(stat);
  1333.                      goto NextMenu;
  1334.                  case 'd':
  1335.                      stat=DeleteMSG();
  1336.                      NoDirF=1;
  1337.                      goto GoNextMsg;
  1338.                  case 'r':
  1339.                      stat=ReplyToMSG();
  1340.                      if(stat<0) return(stat);
  1341.                      NoDirF=1; 
  1342.                      goto GoNextMsg;
  1343.              }      
  1344.            }                    /* end switch */
  1345.          }             /* end if */
  1346.          if((str[0]=='E'||str[0]=='e')&&(GET_BIT(ACS_MSG_EDIT))) {
  1347.                /* 11w add */
  1348.                if(str[1]=='H' || str[1]=='h')
  1349.                {
  1350.                  if((stat=EditHeader())<0) return(stat);
  1351.                }else
  1352.                /* 11w end */
  1353.                  EditEMessage(MailHeader.MsgNumb);
  1354.              stat=DisplayMessage();
  1355.              if(stat<0)  return(stat);
  1356.              goto NextMenu;
  1357.          }
  1358.          if((str[0]=='U'||str[0]=='u')&&(GET_BIT(ACS_ACCOUNT_EDITING))) {
  1359.              strcpy(str,MailHeader.FromName);
  1360.              UNum=Find_User_From_Name(1,str,&tuser,&tuserkeys);
  1361.              stat=Load_Account(UNum,&tuser,&tuserkeys);
  1362.              if(stat==FAILURE) {
  1363.                  AEPutStr("Warning, error while loading account\r\n");
  1364.                  goto NextMenu;
  1365.              }
  1366.              AEPutStr("\014");
  1367.              CallersLog("\tAccount editing from mail.\n");
  1368.              sprintf(GSTR1,"%sCommands/SysCmd/",Cmds->BBSLoc);
  1369.              sprintf(GSTR2,"ACCOUNTS %d",tuser.Slot_Number);
  1370.              if(!CustomCommand(GSTR1,GSTR2,1))
  1371.              (void)EditInfo(UNum,&tuser,&tuserkeys);
  1372.              AEPutStr("\014");
  1373.              stat=DisplayMessage();
  1374.              if(stat<0)   return(stat);
  1375.              goto NextMenu;
  1376.          }
  1377.      }
  1378.      if(str[0]=='Q'||str[0]=='q') {
  1379.          AEPutStr("\r\n");
  1380.          return(SUCCESS);
  1381.      }
  1382.  
  1383.      PassItIN:
  1384.      if(NonStop==0)     NoDirF=0;
  1385.      else     {
  1386.          NoDirF=1;
  1387.          FWDFlag=1;
  1388.          FWDDir='+';
  1389.      }
  1390.      if(str[strlen(str)-1]=='+') {
  1391.          if(FWDFlag==(-1))  MSGNUM+=2;
  1392.          NoDirF=1;
  1393.  
  1394.          FWDToMsg=MailStat.HighMsgNum;
  1395.          FWDFlag=1;
  1396.          FWDDir='+';
  1397.          stat=FirstChar(str);
  1398.          if(stat>=0&&str[stat]=='+')   goto GoNextMsg;
  1399.          str[strlen(str)-1]=' ';
  1400.      }
  1401.      if(str[strlen(str)-1]=='-')  {
  1402.          if(FWDFlag==1) {
  1403.              MSGNUM=MSGNUM-1;
  1404.              MSGNUM=MSGNUM-TEMPFlag;
  1405.          }
  1406.          NoDirF=1;
  1407.          FWDToMsg=MailStat.LowestKey;
  1408.          FWDFlag=-1;
  1409.          FWDDir='-';
  1410.          stat=FirstChar(str);
  1411.          if(stat>=0&&str[stat]=='-')     goto GoNextMsg;
  1412.          str[strlen(str)-1]=' ';
  1413.      }
  1414.      strcat(str," ");
  1415.  
  1416.      stat=FirstChar(str);
  1417.      if(stat>=0)  {
  1418.          if(isdigit(str[stat])) {
  1419.              sscanf(str,"%ld",&MSGNUM);
  1420.  GoNextMsg:
  1421.     if(doormsgcode==2) { doormsgcode=0; return(SUCCESS); }
  1422.     if(doormsgcode==1) doormsgcode=2; 
  1423.     
  1424.     if(stat >=0 || str[stat]=='+' || str[stat] == '-') {
  1425.      //(RTS)
  1426.           if(User_keys.Userflags & USER_SCRNCLR)       AEPutStr("\f");
  1427.     }
  1428.              stat=Readit();
  1429.              if(stat<FAILURE) return(NO_CARRIER);
  1430.              if(stat==10)            return(10);
  1431.              if(stat==FAILURE) {
  1432.                  AEPutStr("\r\n");
  1433.                  if(NumOfZMsgs!=0)   return(SUCCESS);
  1434.                  else                return(FAILURE);
  1435.              }
  1436.          }
  1437.      }
  1438.      NextMenu:
  1439.      AEPutStr("\r\n");
  1440.  }
  1441.  return(SUCCESS);
  1442. }
  1443.  
  1444. static void NoMorePlus(void)
  1445. {
  1446.  char str[100];
  1447.  
  1448.  if(NonStop==0) {
  1449.      if(NoDirF==0) {
  1450.          sprintf(str,"\r\nThe last message in this conference is %ld\r\n",MailStat.HighMsgNum-1);
  1451.          AEPutStr(str);
  1452.      }
  1453.  }
  1454.  NonStop=0;
  1455. }
  1456.  
  1457. static void NoMoreMinus(void)
  1458. {
  1459.  char str[100];
  1460.  
  1461.  if(NonStop==0) {
  1462.      if(NoDirF==0) {
  1463.          sprintf(str,"\r\nThe first message in this conference is %ld\r\n",MailStat.LowestNotDel);
  1464.          AEPutStr(str);
  1465.      }
  1466.  }
  1467.  NonStop=0;
  1468. }
  1469.  
  1470. static int Readit(void)
  1471. {
  1472. TEMPFlag=1;
  1473.  
  1474.  do {
  1475.      if(MSGNUM>MailStat.HighMsgNum-1) {
  1476.          NoMorePlus();         return(FAILURE);
  1477.      }
  1478.      if(MSGNUM<MailStat.LowestKey)  {
  1479.          NoMoreMinus();         return(FAILURE);
  1480.      }
  1481.  
  1482.      stat=Load_MessageHeader();
  1483.      if(stat==FAILURE) {
  1484.          AEPutStr("\r\nMSG Base Error!!!\r\n");       return(FAILURE);
  1485.      }
  1486.  
  1487.      PrivateFlag=0;
  1488.      if((MailHeader.Status[0]=='R')&& !(GET_BIT(ACS_SYSOP_READ)))  {
  1489.          if((StringCompare(MailHeader.ToName,User.Name)!=SUCCESS)&& \
  1490.            (StringCompare(MailHeader.FromName,User.Name)!=SUCCESS)) {
  1491.              PrivateFlag=1;
  1492.              if(NoDirF!=0)      goto NextMSG;
  1493.              AEPutStr("\r\nThat message is Private.\r\n\r\n");
  1494.              NonStop=0;
  1495.              return(SUCCESS);
  1496.          }
  1497.      }
  1498.      if(MailHeader.Status[0]=='D') {
  1499.          PrivateFlag=1;
  1500.          if(NoDirF!=0)        goto NextMSG;
  1501.          AEPutStr("\r\nThat message has been deleted.\r\n\r\n");
  1502.          NonStop=0;
  1503.          MSGNUM=MSGNUM+FWDFlag;
  1504.          return(SUCCESS);
  1505.      }
  1506.  
  1507.      NumOfZMsgs+=1;
  1508.      stat=DisplayMessage();
  1509.      if(stat<0)                 return(stat);
  1510.  
  1511.      if(MSGNUM>Last_Msg_Read_Conf)     Last_Msg_Read_Conf=MSGNUM;
  1512.  
  1513.      MSGNUM=MSGNUM+FWDFlag;
  1514.      return(SUCCESS);
  1515.  
  1516.      NextMSG:
  1517.      if(MSGNUM>Last_Msg_Read_Conf)     Last_Msg_Read_Conf=MSGNUM;
  1518.      MSGNUM=MSGNUM+FWDFlag;
  1519.  } while((MSGNUM<MailStat.HighMsgNum)&&(MSGNUM>=MailStat.LowestKey));
  1520.  
  1521.  if(MSGNUM>=MailStat.HighMsgNum)  NoMorePlus();
  1522.  else NoMoreMinus();
  1523.  
  1524.  return(FAILURE);
  1525. }
  1526.  
  1527. static int ReplyPrompt(void);
  1528.  
  1529. static int SearchNewMail(int cn)
  1530. {
  1531. int MailFLAG;
  1532. long msgcnt=0,dcnt=0;
  1533.  
  1534.     MailFLAG=0;
  1535.     NonStop=0;
  1536.  
  1537.     if(MailStat.HighMsgNum<Last_New_Read_Conf) Last_New_Read_Conf=MailStat.LowestKey;
  1538.     MSGNUM=Last_New_Read_Conf;
  1539.  
  1540.     if(MSGNUM<=0) Last_New_Read_Conf=MSGNUM=MailStat.LowestKey;
  1541.     if(MSGNUM<MailStat.LowestKey) MSGNUM=MailStat.LowestKey;
  1542.     if(MSGNUM>=MailStat.HighMsgNum)
  1543.     {
  1544.             if(cn)    {
  1545.                 AEPutStr("No mail today!\r\n");
  1546.                 } else {
  1547.                 AEPutStr("\r\n");
  1548.                 }
  1549.         return(SUCCESS);
  1550.      }
  1551.  
  1552.  if(!cn)     AEPutStr("\r\nNew Mail Scan  ");
  1553.  
  1554.  do {
  1555.      if(MSGNUM>=MailStat.HighMsgNum) {
  1556.          Last_New_Read_Conf=MailStat.HighMsgNum;
  1557.          goto GetOUT;
  1558.      }
  1559.      msgcnt++;
  1560.      if(msgcnt>9) {
  1561.          msgcnt=0;
  1562.          dcnt++;
  1563.          if(dcnt>9) {
  1564.              if(dcnt>17) {
  1565.                  dcnt=0;
  1566.              }
  1567.              AEPutStr("\b \b");
  1568.          } else   AEPutStr(".");
  1569.  
  1570.      }
  1571.  
  1572.  stat=Load_MessageHeader();
  1573.  if(MailHeader.Status[0]=='D')goto GetNextMSG;
  1574.  if((StringCompare(MailHeader.ToName,User.Name)==SUCCESS)|| \
  1575.            (StringCompare(MailHeader.ToName,"eall")==SUCCESS)) 
  1576.     {
  1577.      if(!netflag || !strcmp(Sopt->BBSConfig,MailHeader.ToNet))
  1578.      {
  1579.      if(MailFLAG==1) {
  1580.          msgcnt=dcnt=0;
  1581.          stat=DisplayMessage();
  1582.          if(stat<0)  return(stat);
  1583.          Last_New_Read_Conf=MSGNUM+1;
  1584.  
  1585.          stat=ReplyPrompt();
  1586.          if(stat==FAILURE)   return(SUCCESS);
  1587.          if(stat<0)  return(stat);
  1588.  
  1589.          AEPutStr("\r\nContinuing New Mail Scan...");
  1590.      }
  1591.      if(MailFLAG==0) {
  1592.          AEPutStr("Found mail!\r\n\r\nWould you like to read it now ");
  1593.          stat=YesNo(1);
  1594.          if(stat<0) return(stat);
  1595.          if(stat) {
  1596.              MailFLAG=1;
  1597.              msgcnt=dcnt=0;
  1598.              stat=DisplayMessage();
  1599.              if(stat<0)  return(stat);
  1600.              Last_New_Read_Conf=MSGNUM+1;
  1601.              stat=ReplyPrompt();
  1602.              if(stat==FAILURE)       return(SUCCESS);
  1603.              if(stat<0)  return(stat);
  1604.  
  1605.              AEPutStr("\r\nContinuing New Mail Scan...");
  1606.          } else {
  1607.              AEPutStr("\r\n");
  1608.              return(SUCCESS);
  1609.          }
  1610.         }
  1611.      }
  1612.  }
  1613.  GetNextMSG:
  1614.  MSGNUM+=1;
  1615.  } while(MSGNUM<=MailStat.HighMsgNum);
  1616.  
  1617. GetOUT:
  1618.  
  1619. if(MailFLAG==0)  AEPutStr("No mail today!\r\n");
  1620.  else            AEPutStr("No more mail!\r\n");
  1621.  
  1622.  return(SUCCESS);
  1623. }
  1624.  
  1625.  
  1626.  
  1627. static int newmailsearch = FALSE;
  1628.  
  1629.  
  1630.  
  1631. static int ReplyPrompt(void)
  1632. {
  1633. int UNum,helplist=0;
  1634. char str[255],string[255];
  1635. //char str1[256];
  1636. for(;;) {
  1637.  FWDFlag=0;
  1638. if(!helplist)
  1639.       {
  1640.        if(NonStop==0)
  1641.         {
  1642.        AEPutStr("\r\nMsg. Options: A,D");
  1643.        AEPutStr(",R,Q");
  1644.        sprintf(string,",?,<CR( %ld ) >: ",MSGNUM);
  1645.        AEPutStr(string);
  1646.        }
  1647.       }
  1648.       else
  1649.       {
  1650.        
  1651.          AEPutStr("\r\nA>gain");
  1652.          AEPutStr("\r\nD>elete Message");
  1653.          AEPutStr("\r\nR>eply");
  1654.          AEPutStr("\r\nQ>uit");
  1655.          sprintf(string,"\r\n<CR>=Next ( %ld ) >: ",MSGNUM);
  1656.          AEPutStr(string);
  1657.          helplist=0;
  1658.       }
  1659.    
  1660.  
  1661.  
  1662.  if(NonStop==0) {
  1663.      stat=LineInput("",str,10,KEYBOARD_TIMEOUT);
  1664.      if(stat<0) return(stat);
  1665.  }  
  1666.     if(str[0]=='?') { helplist=1; continue; }
  1667.     if((str[0]=='N'||str[0]=='n')&&(str[1]=='S'||str[1]=='s'))
  1668.         NonStop=1;
  1669.  
  1670.  if((strlen(str)==0)||(NonStop))     return(SUCCESS);
  1671.  
  1672.  if((str[0]=='A'||str[0]=='a')) {
  1673.          stat=DisplayMessage();
  1674.          if(stat<0) return(stat);
  1675.          continue;
  1676.      }
  1677.  if((str[0]=='D'||str[0]=='d'))  {
  1678.      if((PrivateFlag==0)||((StringCompare(MailHeader.ToName,User.Name)==SUCCESS)
  1679.           && (!netflag || !strcmp(Sopt->BBSConfig,MailHeader.ToNet)))) {
  1680.          stat=DeleteMSG();
  1681.          return(SUCCESS);
  1682.      } else {
  1683.          AEPutStr("\r\nNot your message.\r\n");
  1684.          continue;
  1685.      }
  1686.  }
  1687.  if((str[0]=='E'||str[0]=='e')&&(GET_BIT(ACS_MSG_EDIT))) {
  1688.        if(str[1]=='H' || str[1]=='h')
  1689.        {
  1690.          if((stat=EditHeader())<0) return(stat);
  1691.        }else
  1692.      EditEMessage(MailHeader.MsgNumb);
  1693.      stat=DisplayMessage();
  1694.      if(stat<0)  return(stat);
  1695.      continue;
  1696.  }
  1697.  if((str[0]=='U'||str[0]=='u')) {
  1698.      if(GET_BIT(ACS_ACCOUNT_EDITING)) {
  1699.          strcpy(str,MailHeader.FromName);
  1700.          UNum=Find_User_From_Name(1,str,&tuser,&tuserkeys);
  1701.          stat=Load_Account(UNum,&tuser,&tuserkeys);
  1702.          if(stat==FAILURE) {
  1703.              AEPutStr("Warning, error while loading account\r\n");
  1704.              continue;
  1705.          }
  1706.  
  1707.          AEPutStr("\014");
  1708.          CallersLog("\tAccount editing from mail.\n");
  1709.          (void)EditInfo(UNum,&tuser,&tuserkeys);
  1710.          AEPutStr("\014");
  1711.          stat=DisplayMessage();
  1712.          if(stat<0) return(stat);
  1713.          continue;
  1714.      }
  1715.  }
  1716.  if(str[0]=='Q'||str[0]=='q') {
  1717.      AEPutStr("\r\n");
  1718.      return(FAILURE);
  1719.  }
  1720. //(RTS)
  1721.  
  1722.  if((str[0]=='r'||str[0]=='R'))  {
  1723.      if((PrivateFlag==0)||((StringCompare(MailHeader.ToName,User.Name)==SUCCESS)
  1724.          && (!netflag || !strcmp(Sopt->BBSConfig,MailHeader.ToNet))) 
  1725.          || !strnicmp(MailHeader.ToName,"EALL",4)) {
  1726.          stat=ReplyToMSG();
  1727.          return(SUCCESS);
  1728.      } else {
  1729.          AEPutStr("\r\nNot your message.\r\n");
  1730.          continue;
  1731.      }
  1732.  }
  1733.  AEPutStr("\r\nNo such command!!\r\n");
  1734. }
  1735. return(SUCCESS);
  1736. }
  1737.  
  1738. static int ReplyToMSG(void)
  1739. {
  1740. char str[255],frm[255];
  1741.  
  1742.  DelMSGNUM=MailHeader.MsgNumb;
  1743.  strcpy(frm,MailHeader.ToName);
  1744.  AEPutStr("\r\n                       (------------------------------)\r\n");
  1745.  strcpy(MailHeader.ToName,MailHeader.FromName);
  1746.  sprintf(str,"     To(Enter)='ALL'? %s\r\n",MailHeader.ToName);
  1747.  AEPutStr(str);
  1748.   CheckToForward(str,MailHeader.ToName,1);
  1749.  strcpy(MailHeader.ToNet,MailHeader.FromNet);
  1750.  //sprintf(str,"  ToNet: %s\r\n",MailHeader.ToNet);
  1751.  // if(netflag) AEPutStr(str);
  1752.  strcpy(MailHeader.FromNet,Sopt->BBSConfig);
  1753.  AEPutStr("Subject(Blank)=abort? ");
  1754.  stat=LineInput(MailHeader.Subject,str,30,KEYBOARD_TIMEOUT);
  1755.  if(stat<0) { return(stat); }
  1756.  strcpy(MailHeader.Subject,str);
  1757.  if(strlen(MailHeader.Subject)==0) return(SUCCESS);
  1758.  
  1759.  MailHeader.Recv=0L;
  1760.  
  1761.  ReplyFlag=1;
  1762.  stat=EnterMSG();
  1763.  if(stat<0)  return(stat);
  1764.  
  1765.  if(StringCompare(frm,User.Name)==SUCCESS) {
  1766.      AEPutStr("Delete original message ");
  1767.      stat=YesNo(2);
  1768.      if(stat<0)  return(stat);
  1769.      if(stat)    DeleteMSG();
  1770.  }
  1771. return(SUCCESS);
  1772. }
  1773.  
  1774. int CallMsgFuncs(WORD which,int pass)
  1775. {
  1776. int stat;
  1777.  fileattach=TRUE;
  1778.  strcpy(GSTR3,MsgBase_Location);
  1779.  strcat(GSTR3,"HeaderFile");
  1780.  gfh=Open(GSTR3,MODE_OLDFILE);
  1781.  if(gfh==NULL) {
  1782.      gfh=Open(GSTR3,MODE_NEWFILE);
  1783.      if(gfh==NULL) {
  1784.          MyError(2); fileattach=FALSE;
  1785.          return(FAILURE);
  1786.      }
  1787.  }
  1788.  CurrentSeekPos=0;
  1789.  stat=FAILURE;
  1790.  if(NetConf[0]!='\0') netflag=1; else netflag=0;
  1791. // if(SysBase->LibNode.lib_Version>=36)
  1792.  //SetVBuf(gfh,NULL,1,32768);
  1793.  MCIViewSafe=FALSE;
  1794.  switch(which) {
  1795.      case 1:
  1796.          stat=READMsg();         break;
  1797.      case 2:
  1798.          stat=EnterMSG();        break;
  1799.      case 3:
  1800.          newmailsearch = TRUE;
  1801.          stat=SearchNewMail(pass);
  1802.          newmailsearch = FALSE;
  1803.          break;
  1804.  }
  1805.  Close(gfh);
  1806.  fileattach=FALSE;
  1807.  MCIViewSafe=TRUE;
  1808.  return(stat);
  1809. }
  1810.  
  1811. int ValidNet(char *str)
  1812. {
  1813.   struct DiskObject *dobj;
  1814.   char image[100];
  1815.   if(*(str)=='\0') { strcpy(str,Sopt->BBSConfig); return(TRUE); }
  1816.   if(!strnicmp(str,"ALL",3)) { return(TRUE); }
  1817.     sprintf(image,"%sAmiXnet/Directory/@%s",Cmds->BBSLoc,str);
  1818.     if(dobj=GetDiskObject(image)) { FreeDiskObject(dobj); return(TRUE);}
  1819.   return(FALSE);
  1820. }
  1821.  
  1822. void AttachMsgFiles(long num,char *s)
  1823. {
  1824.   char image[100];
  1825.   char str[100];
  1826.   struct FileInfoBlock *FBlock;
  1827.  BPTR FLock;
  1828.  strcpy(s,"");
  1829.  sprintf(str,"%sF%ld",MsgBase_Location,num);
  1830.  
  1831.  if(FBlock=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) {
  1832.         if(FLock=Lock(str,ACCESS_READ))    {
  1833.          if(Examine(FLock,FBlock)) {
  1834.               while(ExNext(FLock,FBlock))
  1835.               {
  1836.                 sprintf(image,"%sF%ld/%s ",MsgBase_Location,num,FBlock->fib_FileName);
  1837.                 if(strlen(image)+strlen(s)<1024)
  1838.                 {
  1839.                   AEPutStr("\r\nFlagging >:");AEPutStr(FBlock->fib_FileName);
  1840.                  
  1841.                   strcat(s,image);
  1842.                 }
  1843.                   
  1844.             }
  1845.                AEPutStr("\r\n");
  1846.         }
  1847.               UnLock(FLock); 
  1848.          }
  1849.         FreeDosObject(DOS_FIB,FBlock);
  1850.     }
  1851.      
  1852. }       
  1853.  
  1854. void DeleteMsgFiles(long num)
  1855. {
  1856.     char image[100];
  1857.   struct FileInfoBlock *FBlock;
  1858.  BPTR FLock;
  1859.  char str[100];
  1860.  sprintf(str,"%sF%ld",MsgBase_Location,num);
  1861.  
  1862.  if(FBlock=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) {
  1863. exp:
  1864.         if(FLock=Lock(str,ACCESS_READ))    {
  1865.  
  1866.          if(Examine(FLock,FBlock)) {
  1867.               while(ExNext(FLock,FBlock))
  1868.               {
  1869.                 sprintf(image,"%sF%ld/%s",MsgBase_Location,num,FBlock->fib_FileName);
  1870.                 //UnLock(FLock);
  1871.                 DeleteFile(image);// goto exp;
  1872.             }
  1873.                AEPutStr("\r\n");
  1874.         }
  1875.           UnLock(FLock);   
  1876.          }
  1877.         FreeDosObject(DOS_FIB,FBlock);
  1878.          DeleteFile(str);
  1879.     }
  1880.      
  1881. }